﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using SMA.GENTEv1.Dados;

namespace SMA.GENTEv1
{
    public class ProcessoContrato
    {
        #region Variaveis Membro
        private int _idProcessoContrato;
        private TipoProcesso _tipoProcesso;
        private int _idContrato;
        private int _idLocalidade;
        private TipoProtocolo _tipoProtocolo;
        
        private bool _controlaGente;
        private bool _controlaRisco;
        private string _status; // Atino/Inativo
        private string _executado; // SIM/NAO
        private string _configurado; // SIM/NAO

        private GENTEEntities _context;
        #endregion

        #region Propriedades
        public int IdProcessoContrato
        {
            get { return _idProcessoContrato; }
            set { _idProcessoContrato = value; }
        }
        public TipoProcesso TipoProcesso
        {
            get { return _tipoProcesso; }
            set { _tipoProcesso = value; }
        }
        public int IdContrato
        {
            get { return _idContrato; }
            set { _idContrato = value; }
        }
        public int IdLocalidade
        {
            get { return _idLocalidade; }
            set { _idLocalidade = value; }
        }
        public TipoProtocolo TipoProtocolo
        {
            get { return _tipoProtocolo; }
            set { _tipoProtocolo = value; }
        }
        public bool ControlaGente
        {
            get { return _controlaGente; }
            set { _controlaGente = value; }
        }
        public bool ControlaRisco
        {
            get { return _controlaRisco; }
            set { _controlaRisco = value; }
        }
        public string Status
        {
            get { return _status; }
            set { _status = value; }
        }
        public string Executado
        {
            get { return _executado; }
            set { _executado = value; }
        }
        public string Configurado
        {
            get { return _configurado; }
            set { _configurado = value; }
        }
        #endregion

        #region Construtores
        public ProcessoContrato()
        {
            try
            {
                _context = new GENTEEntities();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public ProcessoContrato(int idProcessoContrato)
        {
            try
            {
                _context = new GENTEEntities();
                Carregar(idProcessoContrato);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Privados
        private void Carregar(int idProcessoContrato)
        {
            try
            {
                var consulta = from pc in _context.tab_processo_contrato
                               where pc.id_processo_contrato == idProcessoContrato
                               select new
                               {
                                   pc.id_processo_contrato,
                                   pc.tab_tipo_processo.id_tipo_processo,
                                   id_contrato = pc.tab_contrato.Id_contrato,
                                   pc.planilharisco,
                                   pc.tab_status.id_status,
                                   id_localidade = (pc.tab_cidade == null) ? 0 : pc.tab_cidade.id_cidade,
                                   id_tipo_protocolo = (pc.tab_tipo_protocolo == null) ? 0 : pc.tab_tipo_protocolo.id_tipo_protocolo
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    this.IdProcessoContrato = list.id_processo_contrato;
                    this.TipoProcesso = new TipoProcesso(list.id_tipo_processo);
                    this.IdContrato = list.id_contrato;
                    this.ControlaGente = (list.id_status == 1) ? true : false;
                    this.ControlaRisco = (list.planilharisco == "S") ? true : false;
                    this.Status = list.id_status.ToString();
                    this.IdLocalidade = list.id_localidade;
                    this.TipoProtocolo = new TipoProtocolo(list.id_tipo_protocolo);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private int RecuperaId(int idTipoProcesso, int idContrato)
        {
            try
            {
                int idProcessoContrato = 0;

                var consulta = from pc in _context.tab_processo_contrato
                               where pc.tab_tipo_processo.id_tipo_processo == idTipoProcesso
                               && pc.tab_contrato.Id_contrato == idContrato
                               select new
                               {
                                   pc.id_processo_contrato
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    idProcessoContrato = list.id_processo_contrato;
                }

                return idProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private int RecuperaId(int idTipoProcesso, int idContrato, int idLocalidade)
        {
            try
            {
                int idProcessoContrato = 0;

                var consulta = from pc in _context.tab_processo_contrato
                               where pc.tab_tipo_processo.id_tipo_processo == idTipoProcesso
                               && pc.tab_contrato.Id_contrato == idContrato
                               && pc.tab_cidade.id_cidade == idLocalidade
                               select new
                               {
                                   pc.id_processo_contrato
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    idProcessoContrato = list.id_processo_contrato;
                }

                return idProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        private void VerificaProcessosLocalidade(List<TipoProcesso> listTipoProcesso)
        {
            try
            {
                var consulta = (from tipoprocesso in listTipoProcesso
                                where tipoprocesso.ProcessoCategoria.ProcessoAba.IdProcessoAba == 1
                                select new
                                {
                                    tipoprocesso.Localidade,
                                    tipoprocesso.ProcessoCategoria,
                                    tipoprocesso.ControlaGente
                                }).Distinct();

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    var consulta2 = (from tipoprocesso in listConsulta
                                     where tipoprocesso.Localidade.IdCidade == list.Localidade.IdCidade
                                     && tipoprocesso.ProcessoCategoria.IdProcessoCategoria == list.ProcessoCategoria.IdProcessoCategoria
                                     && tipoprocesso.ControlaGente == true
                                     select tipoprocesso);

                    if (consulta2.ToList().Count > 1)
                    {
                        string msgExcecao = "A aplicação identificou que a categoria de processo " + consulta2.ToList()[0].ProcessoCategoria.Descricao + " que se";
                        msgExcecao += " encontra no grupo de LOCALIDADES contém mais de um processo selecionado dentro dessa mesma categoria para a";
                        msgExcecao += " localidade " + consulta2.ToList()[0].Localidade.NomeCidade + ". Por favor, reveja a seleção no grupo LOCALIDADES para";
                        msgExcecao += " a categoria de processo mencionada, e selecione para a localidade apenas um processo da categoria. Esta operação foi cancelada!";

                        throw new Exception(msgExcecao);
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private bool RetornaProtocoloColetivoVT(int idContrato)
        {
            try
            {
                bool resultado = false;

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((pc.tab_tipo_processo.id_tipo_processo == 42) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 43) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 44) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 45))
                                && (pc.tab_tipo_protocolo.id_tipo_protocolo == 2)
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                resultado = (consulta.ToList().Count > 0) ? true : false;

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private bool RetornaProtocoloColetivoVA(int idContrato)
        {
            try
            {
                bool resultado = false;

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((pc.tab_tipo_processo.id_tipo_processo == 49) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 50) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 51))
                                && (pc.tab_tipo_protocolo.id_tipo_protocolo == 2)
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                resultado = (consulta.ToList().Count > 0) ? true : false;

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private bool RetornaProtocoloColetivoVR(int idContrato)
        {
            try
            {
                bool resultado = false;

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((pc.tab_tipo_processo.id_tipo_processo == 55) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 56) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 57))
                                && (pc.tab_tipo_protocolo.id_tipo_protocolo == 2)
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                resultado = (consulta.ToList().Count > 0) ? true : false;

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private bool RetornaProtocoloColetivoCB(int idContrato)
        {
            try
            {
                bool resultado = false;

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((pc.tab_tipo_processo.id_tipo_processo == 46) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 47) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 48))
                                && (pc.tab_tipo_protocolo.id_tipo_protocolo == 2)
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                resultado = (consulta.ToList().Count > 0) ? true : false;

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private bool RetornaProtocoloColetivoCM(int idContrato)
        {
            try
            {
                bool resultado = false;

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((pc.tab_tipo_processo.id_tipo_processo == 62) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 63) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 64))
                                && (pc.tab_tipo_protocolo.id_tipo_protocolo == 2)
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                resultado = (consulta.ToList().Count > 0) ? true : false;

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private bool RetornaProtocoloColetivoAO(int idContrato)
        {
            try
            {
                bool resultado = false;

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((pc.tab_tipo_processo.id_tipo_processo == 65) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 67) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 68))
                                && (pc.tab_tipo_protocolo.id_tipo_protocolo == 2)
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                resultado = (consulta.ToList().Count > 0) ? true : false;

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private List<ProcessoContrato> BuscarProcessoVT(int idContrato, int idLocalidade, bool somenteProtocolo)
        {
            try
            {
                List<ProcessoContrato> listProcessoContrato = new List<ProcessoContrato>();

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((idLocalidade != 0) ? (pc.tab_cidade.id_cidade == idLocalidade) : (1 == 1))
                                && ((somenteProtocolo) ? (pc.tab_tipo_protocolo.id_tipo_protocolo == 2) : (2 == 2))
                                && ((pc.tab_tipo_processo.id_tipo_processo == 42) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 43) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 44) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 45))
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ProcessoContrato processoContrato = new ProcessoContrato();
                    processoContrato.IdProcessoContrato = list.id_processo_contrato;

                    listProcessoContrato.Add(processoContrato);
                }

                return listProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private List<ProcessoContrato> BuscarProcessoVA(int idContrato, int idLocalidade, bool somenteProtocolo)
        {
            try
            {
                List<ProcessoContrato> listProcessoContrato = new List<ProcessoContrato>();

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((idLocalidade != 0) ? (pc.tab_cidade.id_cidade == idLocalidade) : (1 == 1))
                                && ((somenteProtocolo) ? (pc.tab_tipo_protocolo.id_tipo_protocolo == 2) : (2 == 2))
                                && ((pc.tab_tipo_processo.id_tipo_processo == 49) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 50) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 51))
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ProcessoContrato processoContrato = new ProcessoContrato();
                    processoContrato.IdProcessoContrato = list.id_processo_contrato;

                    listProcessoContrato.Add(processoContrato);
                }

                return listProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private List<ProcessoContrato> BuscarProcessoVR(int idContrato, int idLocalidade, bool somenteProtocolo)
        {
            try
            {
                List<ProcessoContrato> listProcessoContrato = new List<ProcessoContrato>();

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((idLocalidade != 0) ? (pc.tab_cidade.id_cidade == idLocalidade) : (1 == 1))
                                && ((somenteProtocolo) ? (pc.tab_tipo_protocolo.id_tipo_protocolo == 2) : (2 == 2))
                                && ((pc.tab_tipo_processo.id_tipo_processo == 55) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 56) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 57))
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ProcessoContrato processoContrato = new ProcessoContrato();
                    processoContrato.IdProcessoContrato = list.id_processo_contrato;

                    listProcessoContrato.Add(processoContrato);
                }

                return listProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private List<ProcessoContrato> BuscarProcessoCB(int idContrato, int idLocalidade, bool somenteProtocolo)
        {
            try
            {
                List<ProcessoContrato> listProcessoContrato = new List<ProcessoContrato>();

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((idLocalidade != 0) ? (pc.tab_cidade.id_cidade == idLocalidade) : (1 == 1))
                                && ((somenteProtocolo) ? (pc.tab_tipo_protocolo.id_tipo_protocolo == 2) : (2 == 2))
                                && ((pc.tab_tipo_processo.id_tipo_processo == 46) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 47) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 48))
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ProcessoContrato processoContrato = new ProcessoContrato();
                    processoContrato.IdProcessoContrato = list.id_processo_contrato;

                    listProcessoContrato.Add(processoContrato);
                }

                return listProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private List<ProcessoContrato> BuscarProcessoCM(int idContrato, int idLocalidade, bool somenteProtocolo)
        {
            try
            {
                List<ProcessoContrato> listProcessoContrato = new List<ProcessoContrato>();

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((idLocalidade != 0) ? (pc.tab_cidade.id_cidade == idLocalidade) : (1 == 1))
                                && ((somenteProtocolo) ? (pc.tab_tipo_protocolo.id_tipo_protocolo == 2) : (2 == 2))
                                && ((pc.tab_tipo_processo.id_tipo_processo == 62) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 63) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 64))
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ProcessoContrato processoContrato = new ProcessoContrato();
                    processoContrato.IdProcessoContrato = list.id_processo_contrato;

                    listProcessoContrato.Add(processoContrato);
                }

                return listProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private List<ProcessoContrato> BuscarProcessoAO(int idContrato, int idLocalidade, bool somenteProtocolo)
        {
            try
            {
                List<ProcessoContrato> listProcessoContrato = new List<ProcessoContrato>();

                var consulta = (from pc in _context.tab_processo_contrato
                                where (pc.tab_contrato.Id_contrato == idContrato)
                                && ((idLocalidade != 0) ? (pc.tab_cidade.id_cidade == idLocalidade) : (1 == 1))
                                && ((somenteProtocolo) ? (pc.tab_tipo_protocolo.id_tipo_protocolo == 2) : (2 == 2))
                                && ((pc.tab_tipo_processo.id_tipo_processo == 65) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 67) ||
                                    (pc.tab_tipo_processo.id_tipo_processo == 68))
                                && (pc.tab_status.id_status == 1)
                                select new
                                {
                                    pc.id_processo_contrato
                                });

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ProcessoContrato processoContrato = new ProcessoContrato();
                    processoContrato.IdProcessoContrato = list.id_processo_contrato;

                    listProcessoContrato.Add(processoContrato);
                }

                return listProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos

        #region Metodos Publicos - Pesquisa
        public List<ProcessoContrato> SelectAll()
        {
            try
            {
                List<ProcessoContrato> listProcessoContrato = new List<ProcessoContrato>();

                var consulta = from pc in _context.tab_processo_contrato
                               select new
                               {
                                   pc.id_processo_contrato,
                                   pc.tab_tipo_processo.id_tipo_processo,
                                   id_contrato = pc.tab_contrato.Id_contrato,
                                   pc.planilharisco,
                                   pc.tab_status.id_status
                                   //id_localidade = pc.tab_cidade.id_cidade,
                                   //pc.tab_tipo_protocolo.id_tipo_protocolo
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ProcessoContrato processoContrato = new ProcessoContrato();
                    processoContrato.IdProcessoContrato = list.id_processo_contrato;
                    processoContrato.TipoProcesso = new TipoProcesso(list.id_tipo_processo);
                    processoContrato.IdContrato = list.id_contrato;
                    //processoContrato.ControlaRisco = list.planilharisco;
                    //processoContrato.Status = new Status(list.id_status);
                    //processoContrato.IdLocalidade = list.id_localidade;
                    //processoContrato.TipoProtocolo = new TipoProtocolo(list.id_tipo_protocolo);

                    //ContralaGENTE
                    if (list.id_status == 1)
                        processoContrato.ControlaGente = true;
                    else
                        processoContrato.ControlaGente = false;

                    //ControlaRisco
                    if (list.planilharisco == "S")
                        processoContrato.ControlaRisco = true;
                    else
                        processoContrato.ControlaRisco = false;

                    listProcessoContrato.Add(processoContrato);
                }

                return listProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<ProcessoContrato> SelectPor(int idContrato, string nomeProcesso)
        {
            try
            {
                List<ProcessoContrato> listProcessoContrato = new List<ProcessoContrato>();

                var consulta = from pc in _context.tab_processo_contrato
                               join tp in _context.tab_tipo_processo on pc.tab_tipo_processo.id_tipo_processo equals tp.id_tipo_processo
                               where pc.tab_contrato.Id_contrato == idContrato
                               && ((nomeProcesso != "") ? tp.descricao.StartsWith(nomeProcesso) : 1 == 1)
                               && pc.tab_status.id_status == 1
                               orderby tp.descricao
                               select new
                               {
                                   pc.id_processo_contrato,
                                   pc.tab_tipo_processo.id_tipo_processo,
                                   id_contrato = pc.tab_contrato.Id_contrato,
                                   pc.planilharisco,
                                   pc.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ProcessoContrato processoContrato = new ProcessoContrato();
                    processoContrato.IdProcessoContrato = list.id_processo_contrato;
                    processoContrato.TipoProcesso = new TipoProcesso(list.id_tipo_processo);
                    processoContrato.IdContrato = list.id_contrato;

                    WorkflowConfig wf = new WorkflowConfig();

                    processoContrato.Status = ((wf.RetornaUltimoStatus(list.id_processo_contrato)) ? "Ativo" : "Inativo");
                    processoContrato.Executado = ((wf.RetornaExecutado(list.id_processo_contrato)) ? "Sim" : "Não");
                    processoContrato.Configurado = ((wf.RetornaConfigurado(list.id_processo_contrato)) ? "Sim" : "Não");

                    //ContralaGENTE
                    if (list.id_status == 1)
                        processoContrato.ControlaGente = true;
                    else
                        processoContrato.ControlaGente = false;

                    //ControlaRisco
                    if (list.planilharisco == "S")
                        processoContrato.ControlaRisco = true;
                    else
                        processoContrato.ControlaRisco = false;


                    listProcessoContrato.Add(processoContrato);
                }

                return listProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public List<ProcessoContrato> SelectPor(int idContrato, string nomeProcesso, int idProcessoAba)
        {
            try
            {
                List<ProcessoContrato> listProcessoContrato = new List<ProcessoContrato>();

                var consulta = from pc in _context.tab_processo_contrato
                               join tp in _context.tab_tipo_processo on pc.tab_tipo_processo.id_tipo_processo equals tp.id_tipo_processo
                               where (pc.tab_contrato.Id_contrato == idContrato)
                               && ((nomeProcesso != "") ? tp.descricao.StartsWith(nomeProcesso) : 1 == 1)
                               && (pc.tab_status.id_status == 1)
                               && (tp.tab_processo_categoria.tab_processo_aba.id_processo_aba == idProcessoAba)
                               orderby tp.descricao
                               select new
                               {
                                   pc.id_processo_contrato,
                                   pc.tab_tipo_processo.id_tipo_processo,
                                   id_contrato = pc.tab_contrato.Id_contrato,
                                   pc.planilharisco,
                                   pc.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    ProcessoContrato processoContrato = new ProcessoContrato();
                    processoContrato.IdProcessoContrato = list.id_processo_contrato;
                    processoContrato.TipoProcesso = new TipoProcesso(list.id_tipo_processo);
                    processoContrato.IdContrato = list.id_contrato;

                    WorkflowConfig wf = new WorkflowConfig();

                    processoContrato.Status = ((wf.RetornaUltimoStatus(list.id_processo_contrato)) ? "Ativo" : "Inativo");
                    processoContrato.Executado = ((wf.RetornaExecutado(list.id_processo_contrato)) ? "Sim" : "Não");
                    processoContrato.Configurado = ((wf.RetornaConfigurado(list.id_processo_contrato)) ? "Sim" : "Não");

                    //ContralaGENTE
                    if (list.id_status == 1)
                        processoContrato.ControlaGente = true;
                    else
                        processoContrato.ControlaGente = false;

                    //ControlaRisco
                    if (list.planilharisco == "S")
                        processoContrato.ControlaRisco = true;
                    else
                        processoContrato.ControlaRisco = false;


                    listProcessoContrato.Add(processoContrato);
                }

                return listProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool RetornaControlaGente(int idTipoProcesso, int idContrato)
        {
            try
            {
                bool controla = false;

                var consulta = from pc in _context.tab_processo_contrato
                               where pc.tab_tipo_processo.id_tipo_processo == idTipoProcesso
                               && pc.tab_contrato.Id_contrato == idContrato
                               select new
                               {
                                   pc.id_processo_contrato,
                                   pc.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    if (list.id_status == 1)
                        controla = true;
                }

                return controla;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool RetornaControlaGente(int idTipoProcesso, int idContrato, int idLocalidade)
        {
            try
            {
                bool controla = false;

                var consulta = from pc in _context.tab_processo_contrato
                               where pc.tab_tipo_processo.id_tipo_processo == idTipoProcesso
                               && pc.tab_contrato.Id_contrato == idContrato
                               && pc.tab_cidade.id_cidade == idLocalidade
                               select new
                               {
                                   pc.id_processo_contrato,
                                   pc.tab_status.id_status
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    if (list.id_status == 1)
                        controla = true;
                }

                return controla;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool RetornaControlaRisco(int idTipoProcesso, int idContrato)
        {
            try
            {
                bool controla = false;

                var consulta = from pc in _context.tab_processo_contrato
                               where pc.tab_tipo_processo.id_tipo_processo == idTipoProcesso
                               && pc.tab_contrato.Id_contrato == idContrato
                               select new
                               {
                                   pc.id_processo_contrato,
                                   pc.planilharisco
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    if (list.planilharisco == "S")
                        controla = true;
                }

                return controla;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public bool RetornaControlaRisco(int idTipoProcesso, int idContrato, int idLocalidade)
        {
            try
            {
                bool controla = false;

                var consulta = from pc in _context.tab_processo_contrato
                               where pc.tab_tipo_processo.id_tipo_processo == idTipoProcesso
                               && pc.tab_contrato.Id_contrato == idContrato
                               && pc.tab_cidade.id_cidade == idLocalidade
                               select new
                               {
                                   pc.id_processo_contrato,
                                   pc.planilharisco
                               };

                var listConsulta = consulta.ToList();

                foreach (var list in listConsulta)
                {
                    if (list.planilharisco == "S")
                        controla = true;
                }

                return controla;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<ProcessoContrato> BuscarProcessoBeneficio(int idTipoBeneficio, int idContrato, int idLocalidade, bool somenteProtocolo)
        {
            try
            {
                List<ProcessoContrato> listProcessoContrato = new List<ProcessoContrato>();

                switch (idTipoBeneficio)
                {
                    case (int)TipoBeneficio.TipoBenef.Vale_Transporte:
                        listProcessoContrato = BuscarProcessoVT(idContrato, idLocalidade, somenteProtocolo);
                        break;
                    case (int)TipoBeneficio.TipoBenef.Vale_Alimentacao:
                        listProcessoContrato = BuscarProcessoVA(idContrato, idLocalidade, somenteProtocolo);
                        break;
                    case (int)TipoBeneficio.TipoBenef.Vale_Refeicao:
                        listProcessoContrato = BuscarProcessoVR(idContrato, idLocalidade, somenteProtocolo);
                        break;
                    case (int)TipoBeneficio.TipoBenef.Cesta_Basica:
                        listProcessoContrato = BuscarProcessoCB(idContrato, idLocalidade, somenteProtocolo);
                        break;
                    case (int)TipoBeneficio.TipoBenef.Convenio_Medico:
                        listProcessoContrato = BuscarProcessoCM(idContrato, idLocalidade, somenteProtocolo);
                        break;
                    case (int)TipoBeneficio.TipoBenef.Assistencia_Odontologica:
                        listProcessoContrato = BuscarProcessoAO(idContrato, idLocalidade, somenteProtocolo);
                        break;
                }

                return listProcessoContrato;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public bool RetornaProtocoloColetivoBeneficio(int idContrato, int idTipoBeneficio)
        {
            try
            {
                bool resultado = false;

                switch (idTipoBeneficio)
                {
                    case (int)TipoBeneficio.TipoBenef.Vale_Transporte:
                        resultado = RetornaProtocoloColetivoVT(idContrato);
                        break;
                    case (int)TipoBeneficio.TipoBenef.Vale_Alimentacao:
                        resultado = RetornaProtocoloColetivoVA(idContrato);
                        break;
                    case (int)TipoBeneficio.TipoBenef.Vale_Refeicao:
                        resultado = RetornaProtocoloColetivoVR(idContrato);
                        break;
                    case (int)TipoBeneficio.TipoBenef.Cesta_Basica:
                        resultado = RetornaProtocoloColetivoCB(idContrato);
                        break;
                    case (int)TipoBeneficio.TipoBenef.Convenio_Medico:
                        resultado = RetornaProtocoloColetivoCM(idContrato);
                        break;
                    case (int)TipoBeneficio.TipoBenef.Assistencia_Odontologica:
                        resultado = RetornaProtocoloColetivoAO(idContrato);
                        break;
                }

                return resultado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        private void EstruturaGradeCidadeProcesso(ref DataTable grade)
        {
            DataColumn idProcessoContrato = new DataColumn();
            idProcessoContrato.ColumnName = "IdProcessoContrato";
            idProcessoContrato.DataType = Type.GetType("System.Int32");
            grade.Columns.Add(idProcessoContrato);

            DataColumn idCidade = new DataColumn();
            idCidade.ColumnName = "IdLocalidade";
            idCidade.DataType = Type.GetType("System.Int32");
            grade.Columns.Add(idCidade);

            DataColumn nomeCidade = new DataColumn();
            nomeCidade.ColumnName = "NomeCidade";
            nomeCidade.DataType = Type.GetType("System.String");
            grade.Columns.Add(nomeCidade);

        }

        public DataTable BuscarCidadeProcesso(int idProcessoContrato)
        {
            try
            {
                DataTable gradeCidadeProcesso = new DataTable();

                EstruturaGradeCidadeProcesso(ref gradeCidadeProcesso);

                var consulta = (from pc in _context.tab_processo_contrato
                                where pc.id_processo_contrato == idProcessoContrato
                                select new
                                {
                                    pc.id_processo_contrato,
                                    pc.tab_cidade.id_cidade,
                                    pc.tab_cidade.cidade
                                });

                var listConsulta = consulta.ToList();

                DataRow registro;
                foreach (var list in listConsulta)
                {
                    registro = gradeCidadeProcesso.NewRow();
                    registro["IdProcessoContrato"] = list.id_processo_contrato;
                    registro["IdLocalidade"] = list.id_cidade;
                    registro["NomeCidade"] = list.cidade;

                    gradeCidadeProcesso.Rows.Add(registro);
                }

                return gradeCidadeProcesso;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region Metodos Publicos - Persistencia
        public void Salvar()
        {
            try
            {
                if (this.IdProcessoContrato == 0)
                {
                    tab_processo_contrato tabProcessoContrato = new tab_processo_contrato();
                    tabProcessoContrato.tab_tipo_processoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_processo", "id_tipo_processo", this.TipoProcesso.IdTipoProcesso);
                    tabProcessoContrato.tab_contratoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_contrato", "Id_contrato", this.IdContrato);
                    
                    if (this.ControlaRisco)
                        tabProcessoContrato.planilharisco = "S";
                    else
                        tabProcessoContrato.planilharisco = "N";

                    Status status = null;
                    if (this.ControlaGente)
                        status = new Status(1);
                    else
                        status = new Status(2);
                        
                    tabProcessoContrato.tab_statusReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status", "id_status", status.IdStatus);
                    
                    if (this._idLocalidade != 0)
                        tabProcessoContrato.tab_cidadeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_cidade", "id_cidade", this._idLocalidade);
                    else
                        tabProcessoContrato.tab_cidadeReference.EntityKey = null;

                    if (this._tipoProtocolo != null)
                        tabProcessoContrato.tab_tipo_protocoloReference.EntityKey = new EntityKey("GENTEEntities.tab_tipo_protocolo", "id_tipo_protocolo", this._tipoProtocolo.IdProtocolo);
                    else
                        tabProcessoContrato.tab_tipo_protocoloReference.EntityKey = null;

                    _context.AddTotab_processo_contrato(tabProcessoContrato);
                    _context.SaveChanges();
                }
                else
                {
                    tab_processo_contrato tabProcessoContrato = (from pc in _context.tab_processo_contrato
                                                                 where pc.id_processo_contrato == this.IdProcessoContrato
                                                                 select pc).First();

                    tabProcessoContrato.tab_tipo_processoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_tipo_processo", "id_tipo_processo", this.TipoProcesso.IdTipoProcesso);
                    tabProcessoContrato.tab_contratoReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_contrato", "Id_contrato", this.IdContrato);

                    if (this.ControlaRisco)
                        tabProcessoContrato.planilharisco = "S";
                    else
                        tabProcessoContrato.planilharisco = "N";

                    Status status = null;
                    if (this.ControlaGente)
                        status = new Status(1);
                    else
                        status = new Status(2);

                    tabProcessoContrato.tab_statusReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_status", "id_status", status.IdStatus);

                    if (this._idLocalidade != 0)
                        tabProcessoContrato.tab_cidadeReference.EntityKey = new System.Data.EntityKey("GENTEEntities.tab_cidade", "id_cidade", this._idLocalidade);
                    else
                        tabProcessoContrato.tab_cidadeReference.EntityKey = null;

                    if (this._tipoProtocolo != null)
                        tabProcessoContrato.tab_tipo_protocoloReference.EntityKey = new EntityKey("GENTEEntities.tab_tipo_protocolo", "id_tipo_protocolo", this._tipoProtocolo.IdProtocolo);
                    else
                        tabProcessoContrato.tab_tipo_protocoloReference.EntityKey = null;

                    _context.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void Salvar(int idContrato, List<TipoProcesso> listTipoProcesso)
        {
            try
            {
                VerificaProcessosLocalidade(listTipoProcesso);

                foreach (TipoProcesso item in listTipoProcesso)
                {
                    ProcessoContrato processoContrato = new ProcessoContrato();
                    
                    if (item.Localidade == null)
                        processoContrato.IdProcessoContrato = RecuperaId(item.IdTipoProcesso, idContrato);
                    else
                        processoContrato.IdProcessoContrato = RecuperaId(item.IdTipoProcesso, idContrato, item.Localidade.IdCidade);
                    processoContrato.TipoProcesso = item;
                    processoContrato.IdContrato = idContrato;
                    processoContrato.ControlaGente = item.ControlaGente;
                    processoContrato.ControlaRisco = item.ControlaRisco;
                    if (item.Localidade != null)
                        processoContrato.IdLocalidade = item.Localidade.IdCidade;

                    processoContrato.Salvar();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion

    }
}
